from QQLoginTool.QQtool import OAuthQQ
from django.shortcuts import render

# Create your views here.
from rest_framework import status
from rest_framework.response import Response

from rest_framework.views import APIView

from mall import settings
from oauth.models import OAuthQQUser
from oauth.utils import generate_save_token


class QQAuthURLView(APIView):
    """
    提供QQ登录页面网址

    """
    def get(self, request):

        # next表示从哪个页面进入到的登录页面，将来登录成功后，就自动回到那个页面
        state= request.query_params.get('state')
        if not state:
            state= '/'

        # 获取QQ登录页面网址
        oauth = OAuthQQ(client_id=settings.QQ_CLIENT_ID,
                        client_secret=settings.QQ_CLIENT_SECRET,
                        redirect_uri=settings.QQ_REDIRECT_URI,
                        state=state)
        login_url = oauth.get_qq_url()

        return Response({'login_url':login_url})


"""
1.用户同意授权登陆，这个时候 会返回一个code
# 2.我们用code换取token
# 3.有了token,我们再获取openid

前端会收到 用户同意授权后的code   前端应该奖这个code发送给后端

GET /oauth/qq/users/?code=xxxxxx
"""


class OAuthQQuserAPIView(APIView):
    def get(self,request):

        # 1.接收数据
        params = request.query_params
        code = params.get('code')
        if code is None:
            return Response(status=status.HTTP_400_BAD_REQUEST)
        # 2.我们用code换取token
        oauth=OAuthQQ(client_id=settings.QQ_CLIENT_ID,
                    client_secret=settings.QQ_CLIENT_SECRET,
                    redirect_uri=settings.QQ_REDIRECT_URI,)
        try:
            # 使用code向QQ服务器请求access_token
            access_token = oauth.get_access_token(code)
            # 3.有了token,我们再获取openid
            # 使用access_token向QQ服务器请求openid
            openid = oauth.get_open_id(access_token)
        except Exception:
            return Response({'message': 'QQ服务异常'}, status=status.HTTP_503_SERVICE_UNAVAILABLE)
        # openid是此网站上唯一对应用户身份的标识，
        # 网站可将此ID进行存储便于用户下次登录时辨识其身份，
        # 或将其与用户在网站上的原有账号进行绑定。
        # 获取的openid有两种情况：
        # 根据openid进行数据库查询
        try:
            qquser = OAuthQQUser.object.get(openid=openid)
        except OAuthQQUser.DoesNotExist:
            #用户不存在  需要进行绑定
            # 如果openid没绑定美多商城用户，创建用户并绑定到openid
            # 为了能够在后续的绑定用户操作中前端可以使用openid，在这里将openid签名后响应给前端
            access_token_openid = generate_save_token(openid)
            return Response({'access_token': access_token_openid})

        else:
            # 用户存在
            from rest_framework_jwt.settings import api_settings
            # 用户入库之后，我们生成token

            # 我们需要使用jwt的两种方法
            jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER
            jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER

            # 让payload 盛放一些用户信息
            payload = jwt_payload_handler(qquser)
            # 对字符串进行编码处理
            token = jwt_encode_handler(payload)

            response = Response({
                'token': token,
                'user_id': qquser.id,
                'username': qquser.username
            })
            return response



